/*************************************************
 * 描述：自定义视图
 *
 * File：cxiadvancedview.h
 * Author：zhangzhiming@mozihealthcare.cn
 * Date：25-10-15
 * Update：
 * ************************************************/

#ifndef CXIADVANCEDVIEW_H
#define CXIADVANCEDVIEW_H
#include <QStyledItemDelegate>
#include <QtWidgets/QTreeView>
#include <controls/table/head.h>
#include <QHeaderView>
#include <QToolButton>
#include "cxiverticalheaderview.h"

class GlobalDelegateRouter;

class CxiAdvancedView : public QTreeView
{
	Q_OBJECT
public:
	explicit CxiAdvancedView(QWidget *parent = 0);
	~CxiAdvancedView() override;

	/**
	* 应用列配置
	* @param columns
	*/
	void applyColumnConfig(const QList<cxitable::GridColumnConfig> &columns);

	/**
	 * 设置单元格级委托
	 * @param row 原模型行索引
	 * @param column 原模型列索引
	 * @param delegate 委托
	 */
	void setCellDelegate(int row, int column, QStyledItemDelegate* delegate) const;

	/**
	 * 设置单元格级委托
	 * @param row 原模型行索引
	 * @param column 原模型列索引
	 * @param config 配置项
	 * @return
	 */
	void setCellDelegate(int row, int column, const cxitable::GridColumnConfig& config) const;

private:
	// 全局委托路由
	GlobalDelegateRouter* m_globalRouter;


	QRect visualRect(const QModelIndex &index) const override;
	/**
	 * 获取垂直列头
	 * @return
	 */
	QHeaderView *verticalHeader() const;

	/**
	 * 设置垂直列头
	 * @param header
	 */
	void setVerticalHeader(CxiVerticalHeaderView *header);


	// void setHorizontalHeader(QHeaderView *header);
	// QHeaderView *horizontalHeader();

	void setConerButtonEnabled(bool enabled=true);

	void setConerButtonIcon(QIcon  icon);

	void setGroupingEnabled(bool enabled) { m_groupingEnabled = enabled; updateHeaders(); }
	bool isGroupingEnabled() const { return m_groupingEnabled; }

	// 分组模式下的接口（暂空，后续实现）
	// 返回 index 在其所属组（parent）内的序号（0-based），默认返回 0
	int groupIndexWithinParent(const QModelIndex &index) const { Q_UNUSED(index); return 0; }

	signals:
		void connerButtonClicked();

protected:
	void updateGeometries() override;
	void resizeEvent(QResizeEvent *event) override;
	void scrollContentsBy(int dx, int dy) override;

	QModelIndex indexAt(const QPoint &p) const override;

private slots:
	void updateCornerGeometry();
	void updateHeaderMargins();

private:
	void updateHeaders() { if (m_verticalHeader) m_verticalHeader->update(); }

private:

	bool m_groupingEnabled = false;
	CxiVerticalHeaderView *m_verticalHeader;         // 垂直列头
	QToolButton *m_cornerButton;                     // 列头按钮
};


#endif//CXIADVANCEDVIEW_H
